# Поведенческий шаблон проектирования ("Стратегия")
# Позволяет определить семейство схожих алгоритмов и поместить каждый из них в собственный класс, при это изолируя код алгоритмов от остальных классов


import abc


class Reader(metaclass=abc.ABCMeta):
    @abc.abstractmethod
    def parse(self, url: str):
        pass


class ResourceReder:
    def __init__(self, reader: Reader):
        self.__reader = reader

    def set_strategy(self, reader: Reader):
        self.__reader = reader

    def read(self, url: str):
        self.__reader.parse(url)


class NewSiteReader(Reader):
    def parse(self, url: str):
        print('Парсинг новостного сайта: ', url)


class SociaNetworkReader(Reader):
    def parse(self, url: str):
        print('Парсинг ленты новостей социальной сети: ', url)


class TelegramChannelReader(Reader):
    def parse(self, url: str):
        print('Парсинг канала мессенджера Telegram: ', url)


if __name__ == "__main__":
    resource_reader = ResourceReder(
        NewSiteReader()
    )
    url = 'https://news.com'
    resource_reader.read(url)

    url = 'https://facebook.com'
    resource_reader.set_strategy(
        SociaNetworkReader()
    )
    resource_reader.read(url)

    url = '@news_channel_telegram'
    resource_reader.set_strategy(
        TelegramChannelReader()
    )
    resource_reader.read(
        url
    )

    # Парсинг новостного сайта:  https://news.com
    # Парсинг ленты новостей социальной сети:  https://facebook.com
    # Парсинг канала мессенджера Telegram:  @news_channel_telegram
